home *** CD-ROM | disk | FTP | other *** search
- //---------------------------------------------------------------------------
- // variant.cpp - support for delphi variants in cpp
- //---------------------------------------------------------------------------
- // $Revision: 1.44 $
- //-------------------------------------------------------------------------
- // copyright (c) 1997 Borland International
- //----------------------------------------------------------------------------
- #pragma inline
-
- #include<windows.hpp>
- #include<ole2.hpp>
- #include<oleauto.hpp>
- #include <sysutils.hpp>
- #include "variant.hpp"
-
- #ifdef near
- #undef near
- #endif
-
- namespace System
- {
-
- //---------------------------------------------------------------------------
-
- //statics
- Variant __fastcall Variant::CreateObject(const String& ProgID)
- {
- return Oleauto::CreateOleObject(const_cast<String&>(ProgID));
- }
-
- Variant __fastcall Variant::GetActiveObject(const String& ProgID)
- {
- return Oleauto::GetActiveOleObject(const_cast<String&>(ProgID));
- }
-
- //ctors
- __fastcall Variant::Variant()
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- }
-
- __fastcall Variant::Variant(const Variant& rhs)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
-
- System::VarCopyNoInd(*this, rhs);
- }
-
- __fastcall Variant::Variant(const short src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varSmallint;
- VSmallint = src;
- }
-
- __fastcall Variant::Variant(const int src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varInteger;
- VInteger = src;
- }
-
- __fastcall Variant::Variant(const float src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varSingle;
- VSingle = src;
- }
-
- __fastcall Variant::Variant(const double src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varDouble;
- VDouble = src;
- }
-
- __fastcall Variant::Variant(const Currency src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varCurrency;
- VCurrency = src;
- }
-
- __fastcall Variant::Variant(const TDateTime src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varDate;
- VDate = src;
- }
-
- __fastcall Variant::Variant(const bool src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varBoolean;
- VBoolean = src;
- }
-
- __fastcall Variant::Variant(const WordBool src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varBoolean;
- VBoolean = src;
- }
-
- __fastcall Variant::Variant(const Byte src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varByte;
- VByte = src;
- }
-
- __fastcall Variant::Variant(const String& src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varString;
- VString = 0;
- (AnsiString&)VString = src;
- }
-
- __fastcall Variant::Variant(const char* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varString;
- VString = 0;
- (AnsiString&)VString = src;
- }
-
- __fastcall Variant::Variant(wchar_t* const src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varOleStr;
- VOleStr = SysAllocString(src);
- }
-
- __fastcall Variant::Variant(Ole2::IDispatch* const src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varDispatch;
- if (src)
- src->AddRef();
- VDispatch = src;
- }
-
- __fastcall Variant::Variant(Ole2::IUnknown* const src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varUnknown;
- if (src)
- src->AddRef();
- VUnknown = src;
- }
-
- //ByRef constructors
- __fastcall Variant::Variant(short* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varSmallint | varByRef;
- VPointer = src;
- }
-
- __fastcall Variant::Variant(int* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varInteger | varByRef;
- VPointer = src;
- }
-
- __fastcall Variant::Variant(float* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varSingle | varByRef;
- VPointer = src;
- }
-
- __fastcall Variant::Variant(double* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varDouble | varByRef;
- VPointer = src;
- }
-
- __fastcall Variant::Variant(Currency* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varCurrency | varByRef;
- VPointer = src;
- }
-
- __fastcall Variant::Variant(TDateTime* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varDate | varByRef;
- VPointer = src;
- }
-
- __fastcall Variant::Variant(WordBool* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varBoolean | varByRef;
- VPointer = src;
- }
-
- __fastcall Variant::Variant(Byte* src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varByte | varByRef;
- VPointer = src;
- }
-
- __fastcall Variant::Variant(wchar_t** src)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
- VType = varOleStr | varByRef;
- VPointer = src;
- }
-
- //construct a Variant array of type varType
- __fastcall Variant::Variant(const int* bounds,const int boundsSize,Word varType)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
-
- *this = System::VarArrayCreate(bounds, boundsSize, varType);
- }
-
- // construct a one dimensional Variant array of type varVariant
- // and fill with values
- __fastcall Variant::Variant(const Variant* values, const int valuesSize)
- {
- VariantInit(reinterpret_cast<VARIANTARG *>(this));
-
- *this = System::VarArrayOf(values, valuesSize);
- }
-
- __fastcall Variant::~Variant()
- {
- System::VarClear(*this);
- }
-
- Variant& __fastcall Variant::operator =(const Variant& rhs)
- {
- System::VarCopyNoInd(*this, rhs);
- return *this;
- }
-
- Variant& __fastcall Variant::operator +=(const Variant&)
- {
- asm
- {
- extrn @System@@VarAdd$qqrv:near
- call @System@@VarAdd$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator -=(const Variant&)
- {
- asm
- {
- extrn @System@@VarSub$qqrv:near
- call @System@@VarSub$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator *=(const Variant&)
- {
- asm
- {
- extrn @System@@VarMul$qqrv:near
- call @System@@VarMul$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator /=(const Variant&)
- {
- asm
- {
- extrn @System@@VarRDiv$qqrv:near
- call @System@@VarRDiv$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator %=(const Variant&)
- {
- asm
- {
- extrn @System@@VarMod$qqrv:near
- call @System@@VarMod$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator &=(const Variant&)
- {
- asm
- {
- extrn @System@@VarAnd$qqrv:near
- call @System@@VarAnd$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator |=(const Variant&)
- {
- asm
- {
- extrn @System@@VarOr$qqrv:near
- call @System@@VarOr$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator ^=(const Variant&)
- {
- asm
- {
- extrn @System@@VarXor$qqrv:near
- call @System@@VarXor$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator <<=(const Variant&)
- {
- asm
- {
- extrn @System@@VarShl$qqrv:near
- call @System@@VarShl$qqrv
- }
- return *this;
- }
-
- Variant& __fastcall Variant::operator >>=(const Variant&)
- {
- asm
- {
- extrn @System@@VarShr$qqrv:near
- call @System@@VarShr$qqrv
- }
- return *this;
- }
-
- bool __fastcall Variant::operator ==(const Variant&) const
- {
- asm
- {
- extrn @System@@VarCmp$qqrv:near
- call @System@@VarCmp$qqrv
- sete al
- and eax, 1
- }
- }
-
- bool __fastcall Variant::operator !=(const Variant&) const
- {
- asm
- {
- extrn @System@@VarCmp$qqrv:near
- call @System@@VarCmp$qqrv
- setne al
- and eax, 1
- }
- }
-
- bool __fastcall Variant::operator <(const Variant&) const
- {
- asm
- {
- extrn @System@@VarCmp$qqrv:near
- call @System@@VarCmp$qqrv
- setb al
- and eax, 1
- }
- }
-
- bool __fastcall Variant::operator >(const Variant&) const
- {
- asm
- {
- extrn @System@@VarCmp$qqrv:near
- call @System@@VarCmp$qqrv
- seta al
- and eax, 1
- }
- }
-
- bool __fastcall Variant::operator <=(const Variant& rhs) const
- {
- return !operator >(rhs);
- }
-
- bool __fastcall Variant::operator >=(const Variant& rhs) const
- {
- return !operator <(rhs);
- }
-
- Variant __fastcall Variant::operator +(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarAdd$qqrv:near
- mov eax, ptmp
- mov edx, rhs
-
- call @System@@VarAdd$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator -(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarSub$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarSub$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator *(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarMul$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarMul$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator /(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarRDiv$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarRDiv$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator %(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarMod$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarMod$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator &(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarAnd$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarAnd$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator |(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarOr$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarOr$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator ^(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarXor$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarXor$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator <<(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarShl$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarShl$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator >>(const Variant& rhs) const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarShr$qqrv:near
- mov eax, ptmp
- mov edx, rhs
- call @System@@VarShr$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator -() const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarNeg$qqrv:near
- mov eax, ptmp
- call @System@@VarNeg$qqrv
- }
- return tmp;
- }
-
- Variant __fastcall Variant::operator !() const
- {
- Variant tmp(*this);
- Variant* ptmp = &tmp;
- asm
- {
- extrn @System@@VarNot$qqrv:near
- mov eax, ptmp
- call @System@@VarNot$qqrv
- }
- return tmp;
- }
-
- __fastcall Variant::operator short() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varSmallint);
- return tmp.VSmallint;
- }
-
- __fastcall Variant::operator int() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varInteger);
- return tmp.VInteger;
- }
-
- __fastcall Variant::operator float() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varSingle);
- return tmp.VSingle;
- }
-
- __fastcall Variant::operator double() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varDouble);
- return tmp.VDouble;
- }
-
- __fastcall Variant::operator Currency() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varCurrency);
- return tmp.VCurrency;
- }
-
- __fastcall Variant::operator TDateTime() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varDate);
- return tmp.VDate;
- }
-
- __fastcall Variant::operator bool() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varBoolean);
- return (bool)tmp.VBoolean;
- }
-
- __fastcall Variant::operator WordBool() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varBoolean);
- return tmp.VBoolean;
- }
-
- __fastcall Variant::operator Byte() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varByte);
- return tmp.VByte;
- }
-
- __fastcall Variant::operator AnsiString() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varString);
- return AnsiString((AnsiString&)(tmp.VString));
- }
-
- __fastcall Variant::operator Ole2::IDispatch*()
- {
- Variant tmp;
- System::VarCast(tmp, *this, varDispatch);
- if (tmp.VDispatch)
- tmp.VDispatch->AddRef();
- return tmp.VDispatch;
- }
-
- __fastcall Variant::operator Ole2::IUnknown*()
- {
- Variant tmp;
- System::VarCast(tmp, *this, varUnknown);
- if (tmp.VUnknown)
- tmp.VUnknown->AddRef();
- return tmp.VUnknown;
- }
-
- // by ref conversion operators
- __fastcall Variant::operator short*()
- {
- if (VType == (varSmallint | varByRef))
- return reinterpret_cast<short*>(VPointer);
- else if (VType == varSmallint)
- return &VSmallint;
- else
- throw new EVariantError(sOpShortPtr);
- }
-
- __fastcall Variant::operator int*()
- {
- if (VType == (varInteger | varByRef))
- return reinterpret_cast<int*>(VPointer);
- else if (VType == varInteger)
- return &VInteger;
- else
- throw new EVariantError(sOpIntPtr);
- }
-
- __fastcall Variant::operator float*()
- {
- if (VType == (varSingle | varByRef))
- return reinterpret_cast<float*>(VPointer);
- else if (VType == varSingle)
- return &VSingle;
- else
- throw new EVariantError(sOpFloatPtr);
- }
-
- __fastcall Variant::operator double*()
- {
- if (VType == (varDouble | varByRef))
- return reinterpret_cast<double*>(VPointer);
- else if (VType == varDouble)
- return &VDouble;
- else
- throw new EVariantError(sOpDoublePtr);
- }
-
- __fastcall Variant::operator Currency*()
- {
- if (VType == (varCurrency | varByRef))
- return reinterpret_cast<Currency*>(VPointer);
- else if (VType == varCurrency)
- return reinterpret_cast<Currency*>(&VCurrency);
- else
- throw new EVariantError(sOpCurrencyPtr);
- }
-
- __fastcall Variant::operator TDateTime*()
- {
- if (VType == (varDate | varByRef))
- return reinterpret_cast<TDateTime*>(VPointer);
- else if (VType == varDate)
- return reinterpret_cast<TDateTime*>(&VDate);
- else
- throw new EVariantError(sOpTDateTimePtr);
- }
-
- __fastcall Variant::operator WordBool*()
- {
- if (VType == (varBoolean | varByRef))
- return reinterpret_cast<WordBool*>(VPointer);
- else
- throw new EVariantError(sOpBoolPtr);
- }
-
- __fastcall Variant::operator Byte*()
- {
- if (VType == (varByte | varByRef))
- return reinterpret_cast<Byte*>(VPointer);
- else if (VType == varByte)
- return &VByte;
- else
- throw new EVariantError(sOpBytePtr);
- }
-
- __fastcall Variant::operator wchar_t**()
- {
- if (VType == (varOleStr | varByRef))
- return reinterpret_cast<wchar_t**>(VPointer);
- else if (VType == varOleStr)
- return &VOleStr;
- else
- throw new EVariantError(sOpWCharTPtr);
- }
-
- void __fastcall Variant::SetError(const int err)
- {
- Clear();
- VType = varError;
- VError = err;
- }
-
- int __fastcall Variant::GetError() const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varError);
- return tmp.VError;
- }
-
- Variant& __fastcall Variant::ChangeType(int varType)
- {
- Variant tmp;
- System::VarCast(tmp, *this, varType);
- return operator =(tmp);
- }
-
- Variant __fastcall Variant::AsType(int varType) const
- {
- Variant tmp;
- System::VarCast(tmp, *this, varType);
- return tmp;
- }
-
- void __fastcall Variant::Clear()
- {
- System::VarClear(*this);
- }
-
- int __fastcall Variant::Type() const
- {
- return System::VarType(*this);
- }
-
- bool __fastcall Variant::IsNull() const
- {
- return System::VarIsNull(*this);
- }
-
- bool __fastcall Variant::IsEmpty() const
- {
- return System::VarIsEmpty(*this);
- }
-
- bool __fastcall Variant::IsArray() const
- {
- return System::VarIsArray(*this);
- }
-
- int __fastcall Variant::ArrayDimCount() const
- {
- return System::VarArrayDimCount(*this);
- }
-
- int __fastcall Variant::ArrayLowBound(const int dim) const
- {
- return System::VarArrayLowBound(*this, dim);
- }
-
- int __fastcall Variant::ArrayHighBound(const int dim) const
- {
- return System::VarArrayHighBound(*this, dim);
- }
-
- void __fastcall Variant::ArrayRedim(int highBound)
- {
- System::VarArrayRedim(*this, highBound);
- }
-
- Pointer __fastcall Variant::ArrayLock()
- {
- return System::VarArrayLock(*this);
- }
-
- void __fastcall Variant::ArrayUnlock()
- {
- System::VarArrayUnlock(*this);
- }
-
- Variant& __fastcall Variant::operator [](const int idx)
- {
- if (!IsArray() || idx < ArrayLowBound() || idx > ArrayHighBound())
- throw new EVariantError(sVarRangeArray);
-
- Variant* array((Variant*)ArrayLock());
- Variant* v(array + idx);
- ArrayUnlock();
- return *v;
- }
-
- Variant __fastcall Variant::GetElement(const int i1) const
- {
- Variant tmp;
- Variant* ptmp = &tmp;
- asm {
- extrn @System@@VarArrayGet$qr14System@Variantii:near
- push i1
- push 1
- mov eax, this
- push eax
- mov eax, ptmp
- push eax
- call @System@@VarArrayGet$qr14System@Variantii
- add esp, 0x10
- }
- return tmp;
- }
-
- Variant __fastcall Variant::GetElement(const int i1, const int i2) const
- {
- Variant tmp;
- Variant* ptmp = &tmp;
- asm {
- extrn @System@@VarArrayGet$qr14System@Variantii:near
- push i2
- push i1
- push 2
- mov eax, this
- push eax
- mov eax, ptmp
- push eax
- call @System@@VarArrayGet$qr14System@Variantii
- add esp, 0x14
- }
- return tmp;
- }
-
- Variant __fastcall Variant::GetElement(const int i1, const int i2,
- const int i3) const
- {
- Variant tmp;
- Variant* ptmp = &tmp;
- asm {
- extrn @System@@VarArrayGet$qr14System@Variantii:near
- push i3
- push i2
- push i1
- push 3
- mov eax, this
- push eax
- mov eax, ptmp
- push eax
- call @System@@VarArrayGet$qr14System@Variantii
- add esp, 0x18
- }
- return tmp;
- }
-
- Variant __fastcall Variant::GetElement(const int i1, const int i2,
- const int i3, const int i4) const
- {
- Variant tmp;
- Variant* ptmp = &tmp;
- asm {
- extrn @System@@VarArrayGet$qr14System@Variantii:near
- push i4
- push i3
- push i2
- push i1
- push 4
- mov eax, this
- push eax
- mov eax, ptmp
- push eax
- call @System@@VarArrayGet$qr14System@Variantii
- add esp, 0x1C
- }
- return tmp;
- }
-
- Variant __fastcall Variant::GetElement(const int i1, const int i2,
- const int i3, const int i4, const int i5) const
- {
- Variant tmp;
- Variant* ptmp = &tmp;
- asm {
- extrn @System@@VarArrayGet$qr14System@Variantii:near
- push i5
- push i4
- push i3
- push i2
- push i1
- push 5
- mov eax, this
- push eax
- mov eax, ptmp
- push eax
- call @System@@VarArrayGet$qr14System@Variantii
- add esp, 0x20
- }
- return tmp;
- }
-
- void __fastcall Variant::PutElement(const Variant& data, const int i1)
- {
- asm {
- extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
- push i1
- push 1
- mov eax, data
- push eax
- mov eax, this
- push eax
- call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
- add esp, 0x10
- }
- }
-
- void __fastcall Variant::PutElement(const Variant& data, const int i1,
- const int i2)
- {
- asm {
- extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
- push i2
- push i1
- push 2
- mov eax, data
- push eax
- mov eax, this
- push eax
- call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
- add esp, 0x14
- }
- }
-
- void __fastcall Variant::PutElement(const Variant& data, const int i1,
- const int i2, const int i3)
- {
- asm {
- extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
- push i3
- push i2
- push i1
- push 3
- mov eax, data
- push eax
- mov eax, this
- push eax
- call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
- add esp, 0x18
- }
- }
-
- void __fastcall Variant::PutElement(const Variant& data, const int i1,
- const int i2, const int i3, const int i4)
- {
- asm {
- extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
- push i4
- push i3
- push i2
- push i1
- push 4
- mov eax, data
- push eax
- mov eax, this
- push eax
- call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
- add esp, 0x1C
- }
- }
-
- void __fastcall Variant::PutElement(const Variant& data, const int i1,
- const int i2, const int i3, const int i4, const int i5)
- {
- asm {
- extrn @System@@VarArrayPut$qr14System@Variantrx14System@Variantii:near
- push i5
- push i4
- push i3
- push i2
- push i1
- push 5
- mov eax, data
- push eax
- mov eax, this
- push eax
- call @System@@VarArrayPut$qr14System@Variantrx14System@Variantii
- add esp, 0x20
- }
- }
-
- Variant __fastcall Variant::Exec(AutoCmd& cmd, Integer) const
- {
- //Result
- Variant tmp;
- Variant* ptmp = 0;
-
- if (cmd.RequestResult())
- ptmp = &tmp;
-
- //construct a call descriptor
- TCallDesc callDesc;
- TCallDesc* pcallDesc = &callDesc;
-
- // set calltype, argcount, named arg count
- callDesc.CallType = cmd.GetCallType();
- callDesc.ArgCount = cmd.GetArgCount();
- callDesc.NamedArgCount = cmd.GetNamedArgCount();
-
- // fill in arg types for named args
- for (Byte i = 0; i < callDesc.NamedArgCount; i++)
- {
- int argType = cmd.GetNamedArgType(i);
- if (argType == varString)
- callDesc.ArgTypes[i] = varStrArg;
- else if (argType == (varString | varByRef))
- callDesc.ArgTypes[i] = varStrArg + 128;
- else
- {
- callDesc.ArgTypes[i] = (Byte)(argType & varTypeMask);
- callDesc.ArgTypes[i] += (Byte)((argType & varByRef)? 128: 0);
- }
- }
-
- // fill in arg types for un-named args
- for (Byte i = callDesc.NamedArgCount; i < callDesc.ArgCount; i++)
- {
- int argType = cmd.GetArgType((Byte)(i-callDesc.NamedArgCount));
- if (argType == varString)
- callDesc.ArgTypes[i] = varStrArg;
- else if (argType == (varString | varByRef))
- callDesc.ArgTypes[i] = varStrArg + 128;
- else
- {
- callDesc.ArgTypes[i] = (Byte)(argType & varTypeMask);
- callDesc.ArgTypes[i] += (Byte)((argType & varByRef)? 128: 0);
- }
- }
-
- // get ptr that points after all argtypes
- char* p = (char*) &callDesc.ArgTypes[callDesc.ArgCount];
-
- // fill in the name of the cmd
- p = stpcpy(p, (char*)cmd.GetName().c_str());
-
- // fill in names of named args
- for (Byte i = 0; i < callDesc.NamedArgCount; i++)
- p = stpcpy(p+1, (char*)cmd.GetNamedParmName(i).c_str());
-
- // fill an array of values/addresses of named args (makes asm easier)
- void* namedParms[MaxDispArgs*2];
- void* namedParmsPtr = &namedParms;
- Byte namedCursor = 0;
- for (Byte i = 0; i < callDesc.NamedArgCount; i++)
- {
- Variant* v = & cmd.GetNamedParm(i);
- int argType = cmd.GetNamedArgType(i) & varTypeMask;
- bool byRef = cmd.GetNamedArgType(i) & varByRef;
- if (!byRef)
- {
- switch (argType)
- {
- case varString:
- namedParms[namedCursor++] = cmd.GetNamedStringArg(i).c_str();
- break;
- case varDouble:
- case varDate:
- case varCurrency:
- namedParms[namedCursor++] = reinterpret_cast<void*>(*((&v->VInteger) + 1)); //half
- namedParms[namedCursor++] = reinterpret_cast<void*>(v->VInteger); // other half
- break;
- case varSingle:
- case varDispatch:
- case varInteger:
- case varBoolean:
- case varUnknown:
- namedParms[namedCursor++] = reinterpret_cast<void*>(v->VInteger); // pick 1 (union)
- break;
- case varSmallint:
- namedParms[namedCursor++] = reinterpret_cast<void*>((int)v->VSmallint);
- break;
- case varByte:
- namedParms[namedCursor++] = reinterpret_cast<void*>((int)v->VByte);
- break;
- case varVariant:
- namedParms[namedCursor++] = v;
- break;
- }
- }
- else // byRef
- {
- if (argType == varString)
- namedParms[namedCursor++] = cmd.GetNamedStringPtr(i);
- else if (argType == varVariant)
- namedParms[namedCursor++] = v;
- else
- namedParms[namedCursor++] = v->VPointer;
- }
- }
- // fill an array of values/addresses of un-named args (makes asm easier)
- void* parms[MaxDispArgs*2];
- void* parmsPtr = &parms;
- Byte cursor = 0;
- for (Byte i = 0; i < callDesc.ArgCount - callDesc.NamedArgCount; i++)
- {
- Variant* v = & cmd.GetParm(i);
- int argType = cmd.GetArgType(i) & varTypeMask;
- bool byRef = cmd.GetArgType(i) & varByRef;
- if (!byRef)
- {
- switch (argType)
- {
- case varString:
- parms[cursor++] = cmd.GetStringArg(i).c_str();
- break;
- case varDouble:
- case varDate:
- case varCurrency:
- parms[cursor++] = reinterpret_cast<void*>(*((&v->VInteger) + 1)); //half
- parms[cursor++] = reinterpret_cast<void*>(v->VInteger); // other half
- break;
- case varSingle:
- case varDispatch:
- case varInteger:
- case varBoolean:
- case varUnknown:
- parms[cursor++] = reinterpret_cast<void*>(v->VInteger); // pick 1 (union)
- break;
- case varSmallint:
- parms[cursor++] = reinterpret_cast<void*>((int)v->VSmallint);
- break;
- case varByte:
- parms[cursor++] = reinterpret_cast<void*>((int)v->VByte);
- break;
- case varVariant:
- parms[cursor++] = v;
- break;
- }
- }
- else // byRef
- {
- if (argType == varString)
- parms[cursor++] = cmd.GetStringPtr(i);
- else if (argType == varVariant)
- parms[cursor++] = v;
- else
- parms[cursor++] = v->VPointer;
- }
- }
- asm
- {
- extrn @System@@DispInvoke$qv:near
- xor edx, edx
- mov dl, cursor
- dec edx
- imul edx, 4
- add edx, parmsPtr
- mov cl, cursor
- @@0:
- dec cl
- test cl, cl
- jl @@1
- mov eax, [edx]
- push eax
- sub edx, 4
- jmp @@0
-
- @@1:
- xor edx, edx
- mov dl, namedCursor
- dec edx
- imul edx, 4
- add edx, namedParmsPtr
- mov cl, namedCursor
- @@2:
- dec cl
- test cl, cl
- jl @@3
- mov eax, [edx]
- push eax
- sub edx, 4
- jmp @@2
- @@3:
-
- push pcallDesc
- push this
- push ptmp
-
- call @System@@DispInvoke$qv
-
- xor ecx, ecx
- mov cl, cursor
- add cl, namedCursor
- imul ecx, 4
- add ecx, 12
- add esp, ecx
- }
-
- // if no result is returned, return a true
- if (!cmd.RequestResult())
- tmp = true;
-
- return tmp;
- }
-
- // alternate syntax automation stuff
- void Variant::OleProcedure(const String& name, Variant& v0,
- Variant& v1, Variant& v2, Variant& v3,
- Variant& v4, Variant& v5, Variant& v6,
- Variant& v7, Variant& v8, Variant& v9) const
- {
- Procedure p(name);
-
- if (v0.Type() != varEmpty)
- {
- p << v0;
- if (v1.Type() != varEmpty)
- {
- p << v1;
- if (v2.Type() != varEmpty)
- {
- p << v2;
- if (v3.Type() != varEmpty)
- {
- p << v3;
- if (v4.Type() != varEmpty)
- {
- p << v4;
- if (v5.Type() != varEmpty)
- {
- p << v5;
- if (v6.Type() != varEmpty)
- {
- p << v6;
- if (v7.Type() != varEmpty)
- {
- p << v7;
- if (v8.Type() != varEmpty)
- {
- p << v8;
- if (v9.Type() != varEmpty)
- p << v9;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- Exec(p);
- }
-
- Variant Variant::OleFunction(const String& name, Variant& v0,
- Variant& v1, Variant& v2, Variant& v3,
- Variant& v4, Variant& v5, Variant& v6,
- Variant& v7, Variant& v8, Variant& v9) const
- {
- Function p(name);
-
- if (v0.Type() != varEmpty)
- {
- p << v0;
- if (v1.Type() != varEmpty)
- {
- p << v1;
- if (v2.Type() != varEmpty)
- {
- p << v2;
- if (v3.Type() != varEmpty)
- {
- p << v3;
- if (v4.Type() != varEmpty)
- {
- p << v4;
- if (v5.Type() != varEmpty)
- {
- p << v5;
- if (v6.Type() != varEmpty)
- {
- p << v6;
- if (v7.Type() != varEmpty)
- {
- p << v7;
- if (v8.Type() != varEmpty)
- {
- p << v8;
- if (v9.Type() != varEmpty)
- p << v9;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- return Exec(p);
- }
-
- Variant Variant::OlePropertyGet(const String& name, Variant& v0,
- Variant& v1, Variant& v2, Variant& v3,
- Variant& v4, Variant& v5, Variant& v6,
- Variant& v7, Variant& v8, Variant& v9) const
- {
- PropertyGet p(name);
-
- if (v0.Type() != varEmpty)
- {
- p << v0;
- if (v1.Type() != varEmpty)
- {
- p << v1;
- if (v2.Type() != varEmpty)
- {
- p << v2;
- if (v3.Type() != varEmpty)
- {
- p << v3;
- if (v4.Type() != varEmpty)
- {
- p << v4;
- if (v5.Type() != varEmpty)
- {
- p << v5;
- if (v6.Type() != varEmpty)
- {
- p << v6;
- if (v7.Type() != varEmpty)
- {
- p << v7;
- if (v8.Type() != varEmpty)
- {
- p << v8;
- if (v9.Type() != varEmpty)
- p << v9;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- return Exec(p);
- }
-
- void Variant::OlePropertySet(const String& name, Variant& v0,
- Variant& v1, Variant& v2, Variant& v3,
- Variant& v4, Variant& v5, Variant& v6,
- Variant& v7, Variant& v8, Variant& v9) const
- {
- PropertySet p(name);
-
- if (v0.Type() != varEmpty)
- {
- p << v0;
- if (v1.Type() != varEmpty)
- {
- p << v1;
- if (v2.Type() != varEmpty)
- {
- p << v2;
- if (v3.Type() != varEmpty)
- {
- p << v3;
- if (v4.Type() != varEmpty)
- {
- p << v4;
- if (v5.Type() != varEmpty)
- {
- p << v5;
- if (v6.Type() != varEmpty)
- {
- p << v6;
- if (v7.Type() != varEmpty)
- {
- p << v7;
- if (v8.Type() != varEmpty)
- {
- p << v8;
- if (v9.Type() != varEmpty)
- p << v9;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- Exec(p);
- }
- // end of alternate syntax automation stuff
-
- ostream& operator <<(ostream& os, const Variant& arg)
- {
- switch (arg.VType)
- {
- case varEmpty:
- os << "varEmpty";
- break;
- case varNull:
- os << "varNull";
- break;
- case varSmallint:
- os << "varSmallint: " << arg.VSmallint;
- break;
- case varInteger:
- os << "varInteger: " << arg.VInteger;
- break;
- case varSingle:
- os << "varSingle: " << arg.VSingle;
- break;
- case varDouble:
- os << "varDouble: " << arg.VDouble;
- break;
- case varCurrency:
- os << "varCurrency: " << arg.VCurrency;
- break;
- case varDate:
- os << "varDate: " << arg.VDate;
- break;
- case varOleStr:
- os << "varOleStr: " << AnsiString(arg.VOleStr);
- break;
- case varDispatch:
- os << "varDispatch: " << static_cast<void*>(arg.VDispatch);
- break;
- case varError:
- os << "varError: " << arg.VError;
- break;
- case varBoolean:
- os << "varBoolean: " << arg.operator bool();
- break;
- case varUnknown:
- os << "varUnknown: " << static_cast<void*>(arg.VUnknown);
- break;
- case varByte:
- os << "varByte: " << arg.VByte;
- break;
- case varString:
- os << "varString: " << arg.operator AnsiString();
- break;
- case varArray:
- os << "varArray: " << static_cast<void*>(arg.VArray);
- break;
- case varSmallint | varByRef:
- os << "varSmallint | varByRef: " << arg.VPointer;
- break;
- case varInteger | varByRef:
- os << "varInteger | varByRef: " << arg.VPointer;
- break;
- case varSingle | varByRef:
- os << "varSingle | varByRef: " << arg.VPointer;
- break;
- case varDouble | varByRef:
- os << "varDouble | varByRef: " << arg.VPointer;
- break;
- case varCurrency | varByRef:
- os << "varCurrency | varByRef: " << arg.VPointer;
- break;
- case varDate | varByRef:
- os << "varDate | varByRef: " << arg.VPointer;
- break;
- case varOleStr | varByRef:
- os << "varOleStr | varByRef: " << arg.VPointer;
- break;
- case varDispatch | varByRef:
- os << "varDispatch | varByRef: " << arg.VPointer;
- break;
- case varError | varByRef:
- os << "varError | varByRef: " << arg.VPointer;
- break;
- case varBoolean | varByRef:
- os << "varBoolean | varByRef: " << arg.VPointer;
- break;
- case varUnknown | varByRef:
- os << "varUnknown | varByRef: " << arg.VPointer;
- break;
- case varByte | varByRef:
- os << "varByte | varByRef: " << arg.VPointer;
- break;
- case varString | varByRef:
- os << "varString | varByRef: " << arg.VPointer;
- break;
- case varArray | varByRef:
- os << "varArray | varByRef: " << arg.VPointer;
- break;
- }
- return os;
- }
-
- AutoCmd::AutoCmd(const AutoCmd& src): Name(src.Name), Parms(src.Parms),
- ParmTypes(src.ParmTypes), NamedParms(src.NamedParms),
- NamedParmTypes(src.NamedParmTypes), NamedParmNames(src.NamedParmNames)
- {
- for (int i = 0; i < MaxDispArgs; i++)
- {
- StringArgs[i] = src.StringArgs[i];
- StringPtrs[i] = src.StringPtrs[i];
- NamedStringArgs[i] = NamedStringArgs[i];
- NamedStringPtrs[i] = NamedStringPtrs[i];
- }
- }
-
- AutoCmd& AutoCmd::SetName(const String& name)
- {
- Name = name;
- return *this;
- }
-
- AutoCmd& AutoCmd::Clear()
- {
- ClearName();
- ClearArgs();
- return *this;
- }
-
- AutoCmd& AutoCmd::ClearName()
- {
- SetName("");
- return *this;
- }
-
- AutoCmd& AutoCmd::ClearArgs()
- {
- Parms.Clear();
- ParmTypes.Clear();
-
- NamedParms.Clear();
- NamedParmTypes.Clear();
- NamedParmNames.Clear();
-
- return *this;
- }
-
- int AutoCmd::GetArgType(const Byte idx) const
- {
- if (ParmTypes.IsEmpty() || ParmTypes.ArrayHighBound() < idx)
- throw new EVariantError(sAcGatRange);
- return ParmTypes.GetElement(idx);
- }
-
- int AutoCmd::GetNamedArgType(const Byte idx) const
- {
- if (NamedParmTypes.IsEmpty() || NamedParmTypes.ArrayHighBound() < idx)
- throw new EVariantError(sAcGnatRange);
- return NamedParmTypes.GetElement(idx);
- }
-
- Byte AutoCmd::GetArgCount() const
- {
- int count = GetNamedArgCount();
- if (!Parms.IsEmpty())
- count += Parms.ArrayHighBound() + 1;
- return (Byte) count;
- }
-
- Byte AutoCmd::GetNamedArgCount() const
- {
- int count = 0;
- if (!NamedParms.IsEmpty())
- count += NamedParms.ArrayHighBound() + 1;
- return (Byte)count;
- }
-
- Variant& AutoCmd::GetParm(const Byte idx)
- {
- if (Parms.IsEmpty() || Parms.ArrayHighBound() < idx)
- throw new EVariantError(sAcGpRange);
- return Parms[idx];
- }
-
- Variant& AutoCmd::GetNamedParm(const Byte idx)
- {
- if (NamedParms.IsEmpty() || NamedParms.ArrayHighBound() < idx)
- throw new EVariantError(sAcGnpRange);
- return NamedParms[idx];
- }
-
- String AutoCmd::GetNamedParmName(const Byte idx) const
- {
- if (NamedParms.IsEmpty() || NamedParms.ArrayHighBound() < idx)
- throw new EVariantError(sAcGnpnRange);
- return NamedParmNames.GetElement(idx);
- }
-
- void AutoCmd::AddElement()
- {
- if (Parms.IsEmpty())
- {
- Parms = Variant(OPENARRAY(int, (0, 0)), varVariant);
- ParmTypes = Variant(OPENARRAY(int, (0, 0)), varInteger);
- }
- else
- {
- Parms.ArrayRedim(Parms.ArrayHighBound()+1);
- ParmTypes.ArrayRedim(ParmTypes.ArrayHighBound()+1);
- }
- }
-
- AutoCmd& AutoCmd::operator <<(const Variant& v)
- {
- AddElement();
- Parms.PutElement(v, Parms.ArrayHighBound());
- ParmTypes.PutElement(varVariant, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const short arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varSmallint, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const int arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varInteger, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const float arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varSingle, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const double arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varDouble, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const Currency arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varCurrency, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const TDateTime arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varDate, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const bool arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varBoolean, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const WordBool arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varBoolean, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const Byte arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varByte, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const AnsiString& arg)
- {
- AddElement();
- int dummy = 0;
- Parms.PutElement(dummy, Parms.ArrayHighBound());
- ParmTypes.PutElement(varString, ParmTypes.ArrayHighBound());
- StringArgs[Parms.ArrayHighBound()] = arg;
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(Ole2::IDispatch* const arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varDispatch, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(Ole2::IUnknown* const arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varUnknown, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(Variant* arg)
- {
- Variant v;
- v.VType = varVariant | varByRef;
- v.VPointer = arg;
- AddElement();
- Parms.PutElement(v, Parms.ArrayHighBound());
- ParmTypes.PutElement(varVariant | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(short* arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varSmallint | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(int* arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varInteger | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(float* arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varSingle | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(double* arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varDouble | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(Currency* arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varCurrency | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(TDateTime* arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varDate | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(WordBool* arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varBoolean | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(Byte* arg)
- {
- AddElement();
- Parms.PutElement(arg, Parms.ArrayHighBound());
- ParmTypes.PutElement(varByte | varByRef, ParmTypes.ArrayHighBound());
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(AnsiString* arg)
- {
- AddElement();
- int dummy = 0;
- Parms.PutElement(dummy, Parms.ArrayHighBound());
- ParmTypes.PutElement(varString | varByRef, ParmTypes.ArrayHighBound());
- StringPtrs[Parms.ArrayHighBound()] = arg;
- return *this;
- }
-
- AutoCmd& AutoCmd::operator <<(const NamedParm& np)
- {
- if (NamedParms.IsEmpty())
- {
- NamedParms = Variant(OPENARRAY(int, (0, 0)), varVariant);
- NamedParmTypes = Variant(OPENARRAY(int, (0, 0)), varInteger);
- NamedParmNames = Variant(OPENARRAY(int, (0, 0)), varVariant);
- }
- else
- {
- NamedParms.ArrayRedim(NamedParms.ArrayHighBound()+1);
- NamedParmTypes.ArrayRedim(NamedParmTypes.ArrayHighBound()+1);
- NamedParmNames.ArrayRedim(NamedParmNames.ArrayHighBound()+1);
- }
-
- NamedParmNames.PutElement(np.GetParmName(), NamedParmNames.ArrayHighBound());
- int parmType = np.GetType();
- NamedParmTypes.PutElement(parmType, NamedParmTypes.ArrayHighBound());
- if (parmType == varString)
- {
- int dummy = 0;
- NamedParms.PutElement(dummy, NamedParms.ArrayHighBound());
- NamedStringArgs[NamedParms.ArrayHighBound()] = np.GetStringParm();
- }
- else if (parmType == (varString | varByRef))
- {
- int dummy = 0;
- NamedParms.PutElement(dummy, NamedParms.ArrayHighBound());
- NamedStringPtrs[NamedParms.ArrayHighBound()] = np.GetStringPtr();
- }
- else
- NamedParms.PutElement(np.GetParm(), NamedParms.ArrayHighBound());
-
- return *this;
- }
-
- NamedParm::NamedParm(const String& name, Variant* arg): Name(name),
- Type(varVariant | varByRef)
- {
- Variant v;
- v.VType = varVariant | varByRef;
- v.VPointer = arg;
- Parm = v;
- }
-
- Byte Procedure::GetCallType() const
- {
- return DISPATCH_METHOD;
- }
-
- Byte Function::GetCallType() const
- {
- return DISPATCH_METHOD;
- }
-
- Byte PropertySet::GetCallType() const
- {
- return DISPATCH_PROPERTYPUT;
- }
-
- Byte PropertyGet::GetCallType() const
- {
- return DISPATCH_PROPERTYGET;
- }
-
- //---------------------------------------------------------------------
- TDateTime __fastcall TDateTime::CurrentDate()
- {
- return Sysutils::Date();
- }
-
- TDateTime __fastcall TDateTime::CurrentTime()
- {
- return Sysutils::Time();
- }
-
- TDateTime __fastcall TDateTime::CurrentDateTime()
- {
- return Sysutils::Now();
- }
-
- TDateTime __fastcall TDateTime::FileDateToDateTime(int fileDate)
- {
- return Sysutils::FileDateToDateTime(fileDate);
- }
-
- //ctors
- __fastcall TDateTime::TDateTime(const AnsiString& src, TDateTimeFlag flag)
- {
- TDateTime tmp;
- if (flag == DateTime )
- tmp = Sysutils::StrToDateTime(src);
- else if (flag == Date)
- tmp = Sysutils::StrToDate(src);
- else // flag == Time
- tmp = Sysutils::StrToTime(src);
- Val = tmp.Val;
- }
-
- __fastcall TDateTime::TDateTime(unsigned short year, unsigned short month,
- unsigned short day)
- {
- TDateTime tmp = Sysutils::EncodeDate(year, month, day);
- Val = tmp.Val;
- }
-
- __fastcall TDateTime::TDateTime(unsigned short hour, unsigned short min,
- unsigned short sec, unsigned short msec)
- {
- TDateTime tmp = Sysutils::EncodeTime(hour, min, sec, msec);
- Val = tmp.Val;
- }
-
- //other TDateTime functions
- __fastcall TDateTime::operator AnsiString() const
- {
- if (Val < 1)
- return Sysutils::TimeToStr(*this);
- else if ((Val - int(Val)))
- return Sysutils::DateTimeToStr(*this);
- return Sysutils::DateToStr(*this);
-
- }
-
- AnsiString __fastcall TDateTime::FormatString(const AnsiString& format)
- {
- return Sysutils::FormatDateTime(format, *this);
- }
-
- AnsiString __fastcall TDateTime::DateString() const
- {
- return Sysutils::DateToStr(*this);
- }
-
- AnsiString __fastcall TDateTime::TimeString() const
- {
- return Sysutils::TimeToStr(*this);
- }
-
- AnsiString __fastcall TDateTime::DateTimeString() const
- {
- return Sysutils::DateTimeToStr(*this);
- }
-
- int __fastcall TDateTime::DayOfWeek() const
- {
- return Sysutils::DayOfWeek(*this);
- }
-
- int __fastcall TDateTime::FileDate() const
- {
- return Sysutils::DateTimeToFileDate(*this);
- }
- void __fastcall TDateTime::DecodeDate(unsigned short* year,
- unsigned short* month, unsigned short* day) const
- {
- Sysutils::DecodeDate(*this, *year, *month, *day);
- }
- void __fastcall TDateTime::DecodeTime(unsigned short* hour,
- unsigned short* min, unsigned short* sec, unsigned short* msec) const
- {
- Sysutils::DecodeTime(*this, *hour, *min, *sec, *msec);
- }
- //-----------------------------------------------------------------------
- __fastcall Currency::Currency(const AnsiString& src)
- {
- *this = Sysutils::StrToCurr(src);
- }
- //-----------------------------------------------------------------------
- __fastcall Currency::operator AnsiString() const
- {
- return CurrToStr(*this);
- }
-
- }
-
-